stackswitcher: clear timer when widget id disposed
authorChristian Hergert <chergert@redhat.com>
Wed, 2 Jun 2021 17:19:42 +0000 (10:19 -0700)
committerChristian Hergert <chergert@redhat.com>
Wed, 2 Jun 2021 17:20:32 +0000 (10:20 -0700)
If the widget is disposed while the cursor has a drag timeout queued, it
can activate after finalization.

gtk/gtkstackswitcher.c

index 502f3f30374c9c41c52eb8edf478fe6fb35299de..ffbfff98c246aa0a4c39745dd87f57832093fafe 100644 (file)
@@ -225,6 +225,13 @@ gtk_stack_switcher_switch_timeout (gpointer data)
   return G_SOURCE_REMOVE;
 }
 
+static void
+clear_timer (gpointer data)
+{
+  if (data)
+    g_source_remove (GPOINTER_TO_UINT (data));
+}
+
 static void
 gtk_stack_switcher_drag_enter (GtkDropControllerMotion *motion,
                                double                   x,
@@ -239,7 +246,7 @@ gtk_stack_switcher_drag_enter (GtkDropControllerMotion *motion,
                                           gtk_stack_switcher_switch_timeout,
                                           button);
       g_source_set_name_by_id (switch_timer, "[gtk] gtk_stack_switcher_switch_timeout");
-      g_object_set_data (G_OBJECT (button), "-gtk-switch-timer", GUINT_TO_POINTER (switch_timer));
+      g_object_set_data_full (G_OBJECT (button), "-gtk-switch-timer", GUINT_TO_POINTER (switch_timer), clear_timer);
     }
 }